#include "session/session.h"

namespace infer {

TxnnSession::TxnnSession(const std::string& engine_path, const InferConfig& cfg)
  : cfg_(cfg){
    // TODO 设置是否支持 零拷贝

    // TODO 创建 TxnnManager 实例
    manager_ = std::make_unique<TxnnManager>(engine_path, cfg);

    // TODO 加载 kcore & param.bin

    // TODO manager_ 初始化

    // TODO 获取 TensorInfo

    init();

    // 整图或多图推理相关初始化
}

TxnnSession::~TxnnSession() {
  
}

void TxnnSession::init() {
  // 动态形状相关初始化, 暂不添加
  // TODO
}

void TxnnSession::getTensorInfo() {
  // TODO 获取 Tensor 信息
}

void TxnnSession::inferSingleBatch(const std::vector<image::Image>& inputs) {
  std::size_t batch_size = inputs.size();
  if (batch_size < 1 || batch_size > static_cast<size_t>(shape_max[0])) {
    throw std::invalid_argument("Failed to get valid vector of images");
  }

  // TODO 静态batch推理

}

void TxnnSession::inferDynamicBatch(const std::vector<image::Image>& inputs) {
  if (inputs.empty()) {
    throw std::invalid_argument("Failed to get valid vector of images");
  }
  // TODO 动态batch推理(第二版开发)
}

void TxnnSession::infer(const std::vector<image::Image>& inputs) {
  if (is_dynamic_batch_) {
    // 动态batch推理
    inferDynamicBatch(inputs);
  } else {
    // 静态batch推理
    inferSingleBatch(inputs);
  }
}

} // namespace infer